import axios from "axios";
import config from '../config/index'
import {
    ElMessage
} from 'element-plus';

import router from '../router/index'

let NODE_ENV = process.env.NODE_ENV || 'development';
if (NODE_ENV === 'production') {
    NODE_ENV = config.baseUrl.production
} else if (NODE_ENV === 'test') {
    NODE_ENV = config.baseUrl.test
} else {
    NODE_ENV = config.baseUrl.dev
}
// 创建一个axios实例
const service = axios.create({
    baseURL: NODE_ENV,
    //设置超时
    timeout: 30000,
    //`transformRequest`选项允许我们在请求发送到服务器之前对请求的数据做出一些改动，其作用是让参数（data）序列化
    //该选项只适用于以下请求方式：`put/post/patch`
    //数组里面的最后一个函数必须返回一个字符串、-一个`ArrayBuffer`或者`Stream`
    // qs.stringify()将对象 序列化成URL的形式，以&进行拼接（需要qs在此转化为formdata，和api开发人员规定）
    transformRequest: [
        function (data) {
            return JSON.stringify(data);
        }
    ],
    //`paramsSerializer`是一个可选的函数，其作用是让参数（params）序列化
    // 该选项只适用于以下请求方式：`get / delete ` 
    paramsSerializer: function (params) {
        return JSON.stringify(params);
    },
    //`transformResponse`选项允许我们在数据传送到`then/catch`方法之前对数据进行改动
    // 有些时候后台返回的response中真实数据在该对象下某个字段，例如 response.data，又或者是response本身，这里允许返回真实可利用的数据。
    transformResponse: [
        function (data) {
            return data;
        }
    ],
    // 自定义loading参数，可在调用调用时候覆盖，也可以在拦截器里判断状态等。
    // 这样我们可以轻松的定义是否需要在请求之前使用loading组件。
    loading: true,
    // 是否跨域，当然你也可以使用代理proxy 、nginx、
    // 但是一般公司都不会每次都设置代理，而是使用固定的开发模式，例如直接做一个跨域的设置，一劳永逸
    // 这里设置该属性还需要api开发者支持，设置后台的php程序里的header
    withCredentials: false,
    crossDomain: true,
});

// 如果采用json传递给后台数据，格式如下
service.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8";

service.interceptors.request.use(
    config => {
        return config;
    },
    error => {
        return Promise.reject(error);
    }
);

service.interceptors.response.use(
    response => {
        let data = JSON.parse(response.data);
        if (data.code == '401') {
            ElMessage({
                message: data.msg,
                type: 'error',
                duration: 5 * 1000
            });
            router.push({
                path: 'login'
            })
            return
        }
        if (response.status == 200) {
            return Promise.resolve(response);
        } else {
            return Promise.reject(response);
        }
    },
    error => {
        ElMessage({
            message: "操作请求失败，请刷新后重试",
            type: 'error',
            duration: 5 * 1000
        });
        return Promise.reject(error)
    }
);

export default {
    post(url, data) {
        return new Promise((resolve, reject) => {
            service({
                    method: 'post',
                    url,
                    data: data,
                })
                .then(res => {
                    resolve(JSON.parse(res.data))
                })
                .catch(err => {
                    reject(err)
                });
        })
    },
    get(url, data) {
        return new Promise((resolve, reject) => {
            service({
                    method: 'get',
                    url,
                    params: data,
                })
                .then(res => {
                    resolve(JSON.parse(res.data))
                })
                .catch(err => {
                    reject(err)
                })
        })
    }
};